#include "main.h" // 包含头文件

// 初始化队列。初始化成功返回0；初始化失败返回1。
int init_queue(Queue **pq)
{
    (*pq) = malloc(sizeof(Queue));
    if ((*pq) != NULL)
    {
        // succeed
        (*pq)->size = 0;
        return 0;
    }
    else
    {
        // false
        return 1;
    }
}

// 在队列q的尾巴上增加一个元素，其值为value。增加成功，返回0；增加失败，返回1
int enqueue(Queue *q, int value)
{
    if (q->size >= QUEUE_MAX_SIZE)
    {
        // Queue is full
        return 1;
    }
    else
    {
        // success
        q->elements[q->size] = value;
        q->size++;
        return 0;
    }
}

int list_move_to_head_one(Queue *q)
{
    size_t count = q->size - 1;
    for (size_t i = 0; i < count; i++)
    {
        q->elements[i] = q->elements[i + 1];
    }
    return 0;
}

// 从队列q上摘取（去掉）一个元素，将其值放入value中。摘取成功，返回0；摘取失败，返回1。
int dequeue(Queue *q, int *value)
{
    if (q->size == 0)
    {
        // get false
        return 1;
    }
    else
    {
        // get succeed
        *value = q->elements[0];
        list_move_to_head_one(q);
        q->size--;
        return 0;
    }
}

// 获取队列q的第一个元素，但是并不去掉该元素，并将该值放入value中。获取成功返回0；获取失败，返回1。
int first(Queue *q, int *value)
{
    if (q->size == 0)
    {
        // get false
        return 1;
    }
    else
    {
        // get succeed
        *value = q->elements[0];
        return 0;
    }
}

// 判断队列q是否为空。为空，返回0；不为空，返回1。
int isEmpty(Queue *q)
{
    if (q->size == 0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

// 返回队列q中的元素个数。
int size(Queue *q)
{
    return q->size;
}

int main()
{
    Queue *q;
    int val;
    init_queue(&q);
    for (size_t i = 0; i < 10; i++)
    {
        val = i;
        enqueue(q, val);
    }
    dequeue(q, &val);
    printf("dequeue : %d\n", val);

    first(q, &val);
    printf("first : %d\n", val);

    printf("is empyty? %d \n", isEmpty(q));
    printf("queue size : %d \n", size(q));
    return 0;
}